home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / XMODEM1.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  13KB  |  452 lines

  1. ;*************************************;
  2. ; WASM Xmodem Support, Basic          ;
  3. ; By Eric Tauck                       ;
  4. ;                                     ;
  5. ; Defines:                            ;
  6. ;                                     ;
  7. ;   XmdPutH  xmodem send handshake    ;
  8. ;   XmdPut   xmodem send block        ;
  9. ;   XmdRep   wait for a reply         ;
  10. ;   XmdGetH  xmodem receive handshake ;
  11. ;   XmdGet   xmodem receive block     ;
  12. ;   XmdClr   clear the input pipe     ;
  13. ;                                     ;
  14. ; Requires:                           ;
  15. ;                                     ;
  16. ;   CHECK1.ASM                        ;
  17. ;   CHECK3.ASM                        ;
  18. ;   SERIAL1.ASM                       ;
  19. ;   SERIAL2.ASM                       ;
  20. ;   SERIAL3.ASM                       ;
  21. ;   SERIAL4.ASM                       ;
  22. ;   SERIAL5.ASM                       ;
  23. ;   SERIAL6.ASM                       ;
  24. ;*************************************;
  25.  
  26.         jmp     _xmodem1_end
  27.  
  28. ;--- receive block return codes
  29.  
  30. XMODEM_128      EQU     0       ;received a 128 byte block
  31. XMODEM_1024     EQU     1       ;received a 1024 byte block
  32. XMODEM_TIME     EQU     2       ;timeout error
  33. XMODEM_HEADER   EQU     3       ;bad block header
  34. XMODEM_NUMBER   EQU     4       ;block number error
  35. XMODEM_LAST     EQU     5       ;last block number
  36. XMODEM_WRONG    EQU     6       ;wrong block number
  37. XMODEM_CHECK    EQU     7       ;checksum error
  38. XMODEM_REPLY    EQU     8       ;bad reply
  39. XMODEM_NAKED    EQU     9       ;remote error (NAK)
  40. XMODEM_END      EQU     10      ;end of file (EOT)
  41.  
  42. ;--- block flags
  43.  
  44. XMODEM_CRC      EQU     01H     ;16 bit CRC flag (otherwise 8 bit checksum)
  45. XMODEM_BIG      EQU     02H     ;1024 byte block (otherwise 128 bytes)
  46. XMODEM_FAST     EQU     04H     ;fast timer values (BBS's, micro-micro, etc)
  47. XMODEM_EOF      EQU     08H     ;end of file (used internally)
  48.  
  49. ;--- character constants
  50.  
  51. XMODEM_SOH      EQU     1       ;start of 128 byte block
  52. XMODEM_STX      EQU     2       ;start of 1024 byte block
  53. XMODEM_ACK      EQU     6       ;acknowledge
  54. XMODEM_NAK      EQU     21      ;negative acknowledge
  55. XMODEM_EOT      EQU     4       ;end of transmission
  56.  
  57. ;--- timer values
  58.  
  59. _XMOD_SLOW1     EQU     180     ;slow start of block timeout
  60. _XMOD_SLOW2     EQU     90      ;slow middle of block timeout
  61. _XMOD_SLOW3     EQU     68      ;purge timeout 1
  62. _XMOD_SLOW4     EQU     90      ;purge timeout 2
  63. _XMOD_SLOW5     EQU     180     ;reply timeout
  64. _XMOD_SLOW6     EQU     180     ;handshake send timeout
  65. _XMOD_SLOW7     EQU     90      ;handshake receive timeout
  66.  
  67. _XMOD_FAST1     EQU     36      ;fast start of block timeout
  68. _XMOD_FAST2     EQU     18      ;fast middle of block timeout
  69. _XMOD_FAST3     EQU     14      ;purge timeout 1
  70. _XMOD_FAST4     EQU     18      ;purge timeout 2
  71. _XMOD_FAST5     EQU     36      ;reply timeout
  72. _XMOD_FAST6     EQU     180     ;handshake send timeout
  73. _XMOD_FAST7     EQU     90      ;handshake receive timeout
  74.  
  75. ;========================================
  76. ; Xmodem send handshake.
  77. ;
  78. ; In: BX= record address; CL= flags.
  79. ;
  80. ; Out: CL= updated; AL= result; CY= set
  81. ;      if error.
  82.  
  83. XmdPutH PROC    NEAR
  84.  
  85. ;--- time to wait
  86.  
  87.         mov     ax, _XMOD_FAST6 ;fast time values
  88.         test    cl, XMODEM_FAST ;check if fast
  89.         jnz     _xdouh1         ;jump if so
  90.         mov     ax, _XMOD_SLOW6 ;slow time values
  91.  
  92. _xdouh1 push    cx
  93.         call    ComWai          ;wait for byte
  94.         pop     cx
  95.         jc      _xdouh3
  96.  
  97. ;--- check if CRC enabled
  98.  
  99.         sub     ah, ah          ;clear bit
  100.         cmp     al, XMODEM_NAK  ;check if non-CRC symbol
  101.         je      _xdouh2
  102.         test    cl, XMODEM_CRC  ;check if CRC enabled
  103.         jz      _xdouh4         ;jump if not
  104.         cmp     al, 'C'         ;CRC symbol
  105.         jne     _xdouh4
  106.         mov     ah, XMODEM_CRC  ;set bit
  107.  
  108. _xdouh2 and     cl, NOT XMODEM_CRC      ;clear bit
  109.         or      cl, ah
  110.         mov     al, cl                  ;return bits
  111.         clc
  112.         ret
  113.  
  114. ;--- timeout
  115.  
  116. _xdouh3 mov     al, XMODEM_TIME
  117.         stc
  118.         ret
  119.  
  120. ;--- bad handshake code
  121.  
  122. _xdouh4 mov     al, XMODEM_REPLY
  123.         stc
  124.         ret
  125.         ENDP
  126.  
  127. ;========================================
  128. ; Send an xmodem block.
  129. ;
  130. ; In: BX= record address; AX= data
  131. ;     address; CH= block number; CL=
  132. ;     flags.
  133.  
  134. XmdPut  PROC    NEAR
  135.         push    di
  136.         push    si
  137.  
  138.         mov     di, bx
  139.         mov     si, cx
  140.         push    ax              ;save for later
  141.  
  142. ;--- block header
  143.  
  144.         mov     al, XMODEM_SOH  ;128 byte block header
  145.         test    si, XMODEM_BIG  ;check if big block
  146.         jz      _xdput1         ;skip if not
  147.         mov     al, XMODEM_STX  ;1024 byte block header
  148. _xdput1 mov     bx, di          ;record address
  149.         call    ComPut          ;send byte
  150.  
  151. ;--- block number
  152.  
  153.         mov     ax, si          ;block number in AH
  154.         mov     al, 255
  155.         sub     al, ah          ;calculate complement
  156.         mov     bx, di          ;record address
  157.         call    ComPutW         ;send word
  158.  
  159. ;--- data
  160.  
  161.         pop     ax              ;restore data address
  162.         mov     cx, 128         ;128 bytes
  163.         test    si, XMODEM_BIG  ;check if big block
  164.         jz      _xdput2         ;skip if not
  165.         mov     cx, 1024        ;1024 bytes
  166.  
  167. _xdput2 push    ax
  168.         push    cx
  169.         mov     bx, di          ;record address
  170.         call    ComWri          ;write data
  171.         pop     cx
  172.         pop     bx
  173.  
  174. ;--- checksum
  175.  
  176.         mov     ax, OFFSET SumBlk       ;standard checksum
  177.         mov     dx, OFFSET ComPut       ;output byte
  178.         test    si, XMODEM_CRC          ;check if CRC
  179.         jz      _xdput3                 ;jump if not
  180.         mov     ax, OFFSET CrcBlk       ;CRC
  181.         mov     dx, OFFSET ComPutW      ;output word
  182.  
  183. _xdput3 push    dx
  184.         call    ax              ;calculate checksum
  185.         pop     dx
  186.         mov     bx, di          ;serial record
  187.         call    dx              ;send byte or word
  188.  
  189. ;--- finished
  190.  
  191.         pop     si
  192.         pop     di
  193.         ret
  194.         ENDP
  195.  
  196. ;========================================
  197. ; Wait for reply.
  198. ;
  199. ; In: BX= record address; CL= flags.
  200. ;
  201. ; Out: AL= code; CY= set if error.
  202.  
  203. XmdRep  PROC    NEAR
  204.         mov     ax, _XMOD_FAST5 ;fast time values
  205.         test    cl, XMODEM_FAST ;check if fast
  206.         jnz     _xdrep1         ;jump if so
  207.         mov     ax, _XMOD_SLOW5 ;slow time values
  208. _xdrep1 call    ComWai          ;wait for reply
  209.         jc      _xdrep2         ;jump if no timeout
  210.         cmp     al, XMODEM_NAK  ;check if NAK
  211.         je      _xdrep3         ;jump if so
  212.         cmp     al, XMODEM_ACK  ;check if ACK
  213.         jne     _xdrep4         ;jump if not
  214.         clc
  215.         ret
  216.  
  217. ;--- timeout
  218.  
  219. _xdrep2 mov     al, XMODEM_TIME ;timeout error
  220.         ret
  221.  
  222. ;--- NAK
  223.  
  224. _xdrep3 mov     al, XMODEM_NAKED ;remote error
  225.         stc
  226.         ret
  227.  
  228. ;--- invalid reply
  229.  
  230. _xdrep4 mov     al, XMODEM_REPLY ;invalid reply
  231.         stc
  232.         ret
  233.         ENDP
  234.  
  235. ;========================================
  236. ; Xmodem recieve handshake.
  237. ;
  238. ; In: BX= record address; CL= flags.
  239. ;
  240. ; Out: AL= result; CY= set if error.
  241.  
  242. XmdGetH PROC    NEAR
  243.         push    di
  244.         push    si
  245.         mov     di, bx
  246.  
  247. ;--- time to wait
  248.  
  249.         mov     si, _XMOD_FAST7 ;fast time values
  250.         test    cl, XMODEM_FAST ;check if fast
  251.         jnz     _xdinh1         ;jump if so
  252.         mov     si, _XMOD_SLOW7 ;slow time values
  253.  
  254. ;--- check if CRC enabled
  255.  
  256. _xdinh1 mov     al, XMODEM_NAK  ;non-CRC symbol
  257.         test    cl, XMODEM_CRC  ;check if CRC enabled
  258.         jz      _xdinh2         ;jump if not
  259.         mov     al, 'C'         ;CRC symbol
  260.  
  261. ;--- send byte
  262.  
  263. _xdinh2 mov     bx, di          ;record address
  264.         call    ComPut          ;send byte
  265.  
  266. ;--- wait for reply
  267.  
  268.         mov     ax, si          ;time to wait
  269.         mov     bx, di          ;record address
  270.         call    ComAny          ;wait for start of data block
  271.         mov     al, XMODEM_TIME ;only possible error
  272.         pop     si
  273.         pop     di
  274.         ret
  275.         ENDP
  276.  
  277. ;========================================
  278. ; Receive an xmodem block.
  279. ;
  280. ; In: BX= record address; AX= data
  281. ;     address; CH= block number; CL=
  282. ;     flags.
  283. ;
  284. ; Out: AL= result; CY= set if error.
  285.  
  286. XmdGet  PROC    NEAR
  287.         push    di
  288.         push    si
  289.         push    bp
  290.  
  291.         mov     di, bx
  292.         mov     si, cx
  293.  
  294.         push    ax
  295.  
  296. ;--- block header
  297.  
  298.         mov     ax, _XMOD_FAST1 ;fast time values
  299.         mov     bp, _XMOD_FAST2 ;
  300.  
  301.         test    cl, XMODEM_FAST ;check if fast
  302.         jnz     _xdget1         ;jump if so
  303.  
  304.         mov     ax, _XMOD_SLOW1 ;slow time values
  305.         mov     bp, _XMOD_SLOW2 ;
  306.  
  307. _xdget1 mov     bx, di          ;record address
  308.         call    ComWai          ;wait for header
  309.         jc      _xdget3         ;timeout
  310.  
  311.         cmp     al, XMODEM_EOT  ;check if end of transmission
  312.         je      _xdgetA
  313.         mov     cx, 128         ;bytes of data
  314.         cmp     al, XMODEM_SOH  ;check if 128 byte block
  315.         je      _xdget2
  316.         test    si, XMODEM_BIG  ;check if STX allowed
  317.         jz      _xdget4
  318.         cmp     al, XMODEM_STX  ;check if 1024 byte block
  319.         jne     _xdget4
  320.         mov     cx, 1024        ;bytes of data
  321.  
  322. ;--- block number
  323.  
  324. _xdget2 push    cx
  325.         mov     ax, bp
  326.         mov     bx, di
  327.         call    ComWaiW         ;wait for a word
  328.         pop     cx
  329.         jc      _xdget3         ;jump if timeout
  330.         add     al, ah
  331.         cmp     al, 255         ;check if proper complement
  332.         jne     _xdget5
  333.         mov     dx, si
  334.         cmp     ah, dh          ;check if right block number
  335.         je      _xdgetB
  336.         dec     dh              ;previous block number
  337.         cmp     ah, dh          ;check numbers
  338.         je      _xdget6
  339.         jmps    _xdget7
  340.  
  341. ;--- errors
  342.  
  343. _xdget3 mov     al, XMODEM_TIME         ;timeout
  344.         jmps    _xdget9
  345.  
  346. _xdget4 mov     al, XMODEM_HEADER       ;bad header
  347.         jmps    _xdget9
  348.  
  349. _xdget5 mov     al, XMODEM_NUMBER       ;number complement error
  350.         jmps    _xdget9
  351.  
  352. _xdget6 mov     al, XMODEM_LAST         ;last block number
  353.         jmps    _xdget9
  354.  
  355. _xdget7 mov     al, XMODEM_WRONG        ;wrong block number
  356.         jmps    _xdget9
  357.  
  358. _xdget8 mov     al, XMODEM_CHECK        ;bad checksum
  359.  
  360. _xdget9 pop     cx                      ;fix stack
  361.         pop     bp
  362.         pop     si
  363.         pop     di
  364.         stc
  365.         ret
  366.  
  367. ;--- end of transmission
  368.  
  369. _xdgetA pop     ax           
  370.         mov     al, XMODEM_END  ;return code
  371.         push    ax
  372.         jmps    _xdgetE
  373.  
  374. ;--- restore data location and save return block size
  375.  
  376. _xdgetB pop     ax              ;data address
  377.         mov     dl, XMODEM_128  ;128 byte block
  378.         cmp     cx, 128         ;check if 128 bytes
  379.         je      _xdgetC         ;skip if so
  380.         mov     dl, XMODEM_1024 ;must be 1024 byte block
  381. _xdgetC push    dx              ;save for return
  382.  
  383. ;--- data
  384.  
  385.         push    ax
  386.         push    cx
  387.         mov     bx, di
  388.         mov     dx, bp
  389.         call    ComRea          ;read bytes
  390.         pop     cx
  391.         pop     bx
  392.         jc      _xdget3         ;jump if timeout
  393.  
  394. ;--- standard checksum
  395.  
  396.         test    si, XMODEM_CRC  ;check if CRC
  397.         jnz     _xdgetD         ;jump if so
  398.  
  399.         call    SumBlk          ;calculate standard checksum
  400.         push    ax              ;save it
  401.         mov     bx, di
  402.         mov     ax, bp
  403.         call    ComWai          ;get checksum
  404.         pop     dx
  405.         jc      _xdget3         ;jump if timeout
  406.         cmp     al, dl          ;check checksum
  407.         jne     _xdget8         ;jump if error
  408.         jmps    _xdgetE
  409.  
  410. ;--- CRC
  411.  
  412. _xdgetD call    CrcBlk          ;calculate CRC
  413.         push    ax              ;save it
  414.         mov     bx, di
  415.         mov     ax, bp
  416.         call    ComWaiW         ;get checksum
  417.         pop     dx
  418.         jc      _xdget3         ;jump if timeout
  419.         cmp     ax, dx          ;check checksum
  420.         jne     _xdget8         ;jump if error
  421.  
  422. _xdgetE pop     ax
  423.         pop     bp
  424.         pop     si
  425.         pop     di
  426.         clc
  427.         ret
  428.         ENDP
  429.  
  430. ;========================================
  431. ; Clear pipe.
  432. ;
  433. ; In: BX= record address; CL= flags.
  434. ;
  435. ; Out: CY= set if unable to clear.
  436.  
  437. XmdClr  PROC    NEAR
  438.         mov     ax, _XMOD_FAST3 ;fast time values
  439.         mov     dx, _XMOD_FAST4 ;
  440.  
  441.         test    cl, XMODEM_FAST ;check if fast
  442.         jnz     _xdclr1         ;jump if so
  443.  
  444.         mov     ax, _XMOD_SLOW3 ;slow time values
  445.         mov     dx, _XMOD_SLOW4 ;
  446.  
  447. _xdclr1 call    ComEmp          ;empty pipe
  448.         ret
  449.         ENDP
  450.  
  451. _xmodem1_end
  452.